package structure.Flyweight;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by LYJ on 2016/10/19.
 * 详细链接：Flyweight（享元）http://blog.csdn.net/u013256816/article/details/51009522
 */
public class MainTest {
    public static void main(String... args) {
        //单纯享元
        FlyWeightFactory factory=new FlyWeightFactory();
        Flyweight f1=factory.factory("a");
        Flyweight f2=factory.factory("b");
        Flyweight f3=factory.factory("a");
        f1.operation("a fly weight");
        f2.operation("b fly weight");
        f3.operation("c fly weight");
        System.out.println(f1==f3);
        System.out.println(factory.getFlyweightSize());
        System.out.println("\n");
        //-------------------------------------------------------
        //复合享元
        List<String> list = new ArrayList<String>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("a");
        list.add("b");

        FlyweightCompositeFactory factory1 = new FlyweightCompositeFactory();
        Flyweight ff1 = factory1.factory(list);
        Flyweight ff2 = factory1.factory(list);
        f1.operation("Composite Call");
        System.out.println("=======");
        System.out.println("复合享元模式是否可以共享对象："+(ff1 == ff2));

        String str = "a";
        Flyweight ff3 = factory.factory(str);
        Flyweight ff4 = factory.factory(str);
        System.out.println("单纯享元模式是否可以共享对象："+(ff3 == ff4));
        //一个符合享元对象的所有单纯享元对象元素的外蕴状态都是与复合享元对象的外蕴状态相等的。
        // 一个复合享元对象所含有的单纯享元对象的内蕴状态一般是不相等的。复合享元对象是不能共享的。单纯享元对象是可以共享的。
    }
}
/*
优缺点
优点：大幅度降低内存中对象的数量
缺点：享元模式使得系统更加复杂。为了使对象可以共享，需要将一些状态外部化，
这使得程序的逻辑复杂化。享元模式将享元对象的状态外部化，而读取外部状态使得运行时间稍微变长。
Jdk中的享元模式
java.lang.Integer#valueOf(int)
java.lang.Boolean#valueOf(boolean)
java.lang.Byte#valueOf(byte)
java.lang.Character#valueOf(boolean)
 */